package com.cskaoyan.javase.oop2.final9.variable.member1;

/**
 * @description: final修饰普通成员变量
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * final修饰普通成员变量
 *
 * - final修饰普通成员变量，表示常量，在整个创建对象过程中它们的值，只能修改一次也必须显式赋值一次
 * - 总结给普通成员变量赋值的方式
 *   - 显式初始化语句
 *   - 构造代码块
 *   - 构造器
 *   - 创建对象后，调set方法，或者直接赋值
 *   - 对于final修饰的普通成员变量，前三种必然要有一种，也就是说创建对象之前，该final修饰的成员变量的取值一定要确定
 * - 对于同一个类的同一个final修饰的变量，不同对象可能会有不同的值
 *
 * final修饰普通成员变量比较少见，几乎不用
 * 既然是常量，就应该是怎么都不变的量，但是如果用final修饰普通成员变量，代表该常量是每个对象一个
 * 并且每个对象完全有可能不同，这就不叫常量了
 * 所以真正的常量应该不属于对象，而属于类，于是加static修饰
 *
 */
public class Demo {
    public static void main(String[] args) {
        //筑基期的菜鸡
        Student s = new Student(100);
        //元婴期的老怪
        Student s2 = new Student(1000);
        System.out.println(s.AGE);
        System.out.println(s2.AGE);
    }
}

class Student {
 final int AGE  ; //这里虽然加了final变成常量了 但是它仍然属于对象 在jvm内存中的位置不变
    {
        //AGE = 20;
    }
    public Student(int age) {
        this.AGE = age;
    }

    //添加一个细节，现在Student类没有无参构造了，思考：如果我手动添加无参构造，代码会报错吗？
    //当然会报错，这里就和if多分支 return一样

    public Student() {
        this.AGE = 10;
    }
}
